package lang;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class ObjectTest {
    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        list1.add("a");
        list1.add("b");

        // 深拷贝
        List<String> list3 = CopyFactory.deepCopy(list1);
        System.out.println("Before modification:");
        System.out.println("list1: " + list1);
        System.out.println("list3: " + list3);
        list3.add("d");
        System.out.println("After modification:");
        System.out.println("list1: " + list1);
        System.out.println("list3: " + list3);
    }
}
// 浅拷贝
// 对象的引用地址不会改变，对象的值也不会改变
// 深拷贝
// 最好不要去使用 clone()，可以使用拷贝构造函数或者拷贝工厂来拷贝一个对象。
// 拷贝工厂
// 对象的拷贝构造函数，拷贝构造函数的返回值是一个新的对象
// 对象的拷贝构造函数，拷贝工厂的返回值是一个新的对象
/**
 * Copy Factory
 */
class CopyFactory {
    public static <T> T deepCopy(T object) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(object);

            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
            return (T) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
            return null;
        }
    }
}